package br.com.speedprevweb.dao.impl;

import br.com.speedprevweb.dao.UsuarioDao;
import br.com.speedprevweb.model.Usuario;
import br.com.speedprevweb.util.HibernateUtil;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class UsuarioDaoImpl implements UsuarioDao {

  private boolean valid(Usuario usuario) {
    if (usuario.getFuncaoUsuario().getDsFuncaoUsuario().isEmpty()) {
      return false;
    } else {
      if (usuario.getNmUsuario().isEmpty()) {
        return false;
      } else {
        return !usuario.getNmLogin().isEmpty();
      }
    }
  }

  @Override
  public boolean inserir(Usuario usuario) {
    Transaction tx = null;
    Session session = HibernateUtil.getSessionFactory().openSession();
    try {
      tx = session.beginTransaction();
      if (valid(usuario)) {
        session.save(usuario);
        return true;
      }
    } catch (HibernateException e) {
      tx.rollback();
      throw e;
    }
    return false;
  }

  @Override
  public boolean alterar(Usuario usuario) {
    Transaction tx = null;
    Session session = HibernateUtil.getSessionFactory().openSession();
    try {
      tx = session.beginTransaction();
      if (valid(usuario)) {
        session.update(usuario);
        return true;
      }
    } catch (HibernateException e) {
      tx.rollback();
      throw e;
    }
    return false;
  }

  @Override
  public boolean excluir(Usuario usuario) {
    Transaction tx = null;
    Session session = HibernateUtil.getSessionFactory().openSession();
    try {
      tx = session.beginTransaction();
      session.delete(usuario);
      return true;
    } catch (HibernateException e) {
      tx.rollback();
      throw e;
    }
  }

  @Override
  public Usuario getUsuario(Usuario usuario) {
    Transaction tx = null;
    Session session = HibernateUtil.getSessionFactory().openSession();
    String sql = "FROM Usuario u where u.idUsuario = :pId";
    try {
      tx = session.beginTransaction();
      Query query = session.createQuery(sql);
      query.setInteger("pId", usuario.getIdUsuario());
      return (Usuario) query.uniqueResult();
    } catch (HibernateException e) {
      tx.rollback();
      throw e;
    }
  }

  @Override
  public List listarTodos() {
    Transaction tx = null;
    Session session = HibernateUtil.getSessionFactory().openSession();
    String sql = "FROM Usuario u order by u.nmUsuario";
    try {
      tx = session.beginTransaction();
      Query query = session.createQuery(sql);
      return query.list();
    } catch (HibernateException e) {
      tx.rollback();
      throw e;
    }
  }

  @Override
  public Usuario login(Usuario usuario) {
    Transaction tx = null;
    Session session = HibernateUtil.getSessionFactory().openSession();
    String sql = "FROM Usuario u where u.nmLogin = :pUsuario and u.dsPassword = :pSenha";
    try {
      tx = session.beginTransaction();
      Query query = session.createQuery(sql);
      query.setString("pUsuario", usuario.getNmLogin());
      query.setString("pSenha", usuario.getDsPassword());
      return (Usuario) query.uniqueResult();
    } catch (HibernateException e) {
      tx.rollback();
      throw e;
    }
  }

}
